//package cn.yl.api.server.util.redis;
//
//import lombok.extern.slf4j.Slf4j;
//import net.minidev.json.JSONUtil;
//import org.springframework.dao.DataAccessException;
//import org.springframework.data.redis.connection.RedisConnection;
//import org.springframework.data.redis.core.Cursor;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.core.ScanOptions;
//import org.springframework.data.redis.core.ZSetOperations;
//
//import java.util.*;
//import java.util.concurrent.TimeUnit;
//
//@Slf4j
//public class RedisHelper {
//
//    // redis 锁的key
//    public static final String lockKey = "_sys_redis_lock_key_name_";
//
//    /**
//     * redis 获取锁
//     *
//     * @return void
//     * @params [redisTemplate]
//     */
//    public static void lock(RedisTemplate<String, String> redisTemplate) {
//        Boolean lock = false;
//        while (!lock || lock == null) {
//            try {
//                lock = redisTemplate.opsForValue().setIfAbsent(lockKey, lockKey, 20, TimeUnit.SECONDS);
//                if (!lock) {
//                    Thread.sleep(500);
//                }
//            } catch (Exception e) {
//                log.error("redis 获取锁失败！");
//                e.printStackTrace();
//            }
//        }
//    }
//
//    /**
//     * redis 解除锁
//     *
//     * @return void
//     * @params [redisTemplate]
//     */
//    public static void unLock(RedisTemplate<String, String> redisTemplate) {
//        redisTemplate.delete(lockKey);
//    }
//
//    /**
//     * RedisTemplate keys 的替代
//     *
//     * @return java.util.List<java.lang.String>
//     * @params [redisTemplate]
//     */
//    public static List<String> scan(RedisTemplate<String, String> redisTemplate, String keys, Integer count) {
//        Set<String> keySet = new HashSet<>();
//        RedisConnection redisConnection = null;
//        try {
//            redisConnection = redisTemplate.getConnectionFactory().getConnection();
//            ScanOptions options = ScanOptions.scanOptions().match(keys).count(count).build();
//            Cursor<byte[]> c = redisConnection.scan(options);
//            while (c.hasNext()) {
//                keySet.add(new String(c.next()));
//            }
//        } catch (Exception e) {
//            log.error("redis scan 发生异常：");
//            e.printStackTrace();
//        } finally {
//            if (redisConnection != null) {
//                try {
//                    redisConnection.close();
//                } catch (DataAccessException dataAccessException) {
//                    log.error("关闭 redis 连接异常：");
//                    dataAccessException.printStackTrace();
//                }
//            }
//        }
//        return new ArrayList<>(keySet);
//    }
//
//    /**
//     * hash 的 scan 迭代器的实现
//     *
//     * @return java.util.List<java.lang.String>
//     * @params [redisTemplate, keys, count]
//     */
//    public static Map<String, String> hScan(RedisTemplate<String, String> redisTemplate, String redisKey, String keys, Integer count) {
//        Map<String, String> mapData = new HashMap<>();
//        try {
//            Cursor<Map.Entry<String, String>> cursor = redisTemplate.<String, String>opsForHash().scan(redisKey,
//                    ScanOptions.scanOptions().match(keys).count(count).build());
//            while (cursor.hasNext()) {
//                Map.Entry<String, String> entry = cursor.next();
//                mapData.put(entry.getKey(), entry.getValue());
//            }
//            cursor.close();
//        } catch (Exception e) {
//            log.error("redis hscan 异常：");
//            e.printStackTrace();
//        }
//        return mapData;
//    }
//
//
//    /**
//     * set 的 scan 迭代器的实现
//     *
//     * @return java.util.List<java.lang.String>
//     * @params [redisTemplate, keys, count]
//     */
//    public static List<String> sScan(RedisTemplate<String, String> redisTemplate, String redisKey, String keys, Integer count) {
//        List<String> setDataList = new ArrayList<>();
//        try {
//            Cursor<String> cursor = redisTemplate.opsForSet().scan(redisKey,
//                    ScanOptions.scanOptions().match(keys).count(count).build());
//            while (cursor.hasNext()) {
//                setDataList.add(cursor.next());
//            }
//            cursor.close();
//        } catch (Exception e) {
//            log.error("redis sscan 异常：");
//            e.printStackTrace();
//        }
//        return setDataList;
//    }
//
//
//    /**
//     * zset 的 scan 迭代器的实现
//     *
//     * @return java.util.List<java.lang.String>
//     * @params [redisTemplate, keys, count]
//     */
//    public static List<ZSetOperations.TypedTuple<String>> zScan(RedisTemplate<String, String> redisTemplate, String redisKey, String keys, Integer count) {
//        List<ZSetOperations.TypedTuple<String>> zSetDataList = new ArrayList<>();
//        try {
//            Cursor<ZSetOperations.TypedTuple<String>> cursor = redisTemplate.opsForZSet().scan(redisKey,
//                    ScanOptions.scanOptions().match(keys).count(count).build());
//            while (cursor.hasNext()) {
//                zSetDataList.add(cursor.next());
//            }
//            cursor.close();
//        } catch (Exception e) {
//            log.error("redis zscan 异常：");
//            e.printStackTrace();
//        }
//        return zSetDataList;
//    }
//
//    /**
//     * @Description 获取redis hash 带过期时间的数据
//     * @Param [redisTemplate, redisKey, hashKey]
//     * @Return java.lang.String
//     */
//    public static Object getRedisHash(RedisTemplate<String, String> redisTemplate, String redisKey, String hashKey) {
//        String hashValue = redisTemplate.<String, String>opsForHash().get(redisKey, hashKey);
//        if (hashValue == null) {
//            return null;
//        }
//        RedisExpireData redisData = JSONUtil.json2Obj(hashValue, RedisExpireData.class);
//        if (redisData == null) {
//            return null;
//        } else {
//            Object obj = redisData.getStoreData();
//            if (obj == null) {
//                redisTemplate.<String, String>opsForHash().delete(redisKey, hashKey);
//            }
//            return obj;
//        }
//    }
//
//    /**
//     * @Description 设置带过期时间的redis hash
//     * @Param [redisTemplate, redisKey, hashKey, hashValue, expire, timeUnit]
//     * @Return void
//     */
//    public static void setRedisHash(RedisTemplate<String, String> redisTemplate, String redisKey, String hashKey, Object hashValue, Long expire, TimeUnit timeUnit) {
//        RedisExpireData redisData = new RedisExpireData(hashValue, timeUnit.toMillis(expire));
//        redisTemplate.<String, String>opsForHash().put(redisKey, hashKey, JSONUtil.obj2Json(redisData));
//    }
//}